package com.samp.solr.hanlp.ner;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;

import java.util.List;

/**
 * 命名实体识别---基于HMM角色标注的命名实体识别 （速度快）
 * 能识别：中国人名识别、音译人名识别、日本人名识别、地名识别、实体机构名识别
 * 相对来说，感知机和CRF模型精度更高，但速度慢，需要模型。
 * 名词相应标识：
 * n=名词
 * nr=人名 nrf 音译人名 nrj 日文人名
 * ns=地名
 * nt=机构团体
 * nx=外文字符
 * nz=其他专名
 */
public class HmmNerDemo {

    /**
     * 1：中文名识别，中文名标识：nr
     * 2：目前分词器基本上都默认开启了中国人名识别,不用手工开户。
     * 3：有一定的误命中率，比如误命中关键年，则可以通过在data/dictionary/person/nr.txt加入一条关键年 A 1
     *    来排除关键年作为人名的可能性，也可以将关键年作为新词登记到自定义词典中
     * 4：使用感知机或CRF词法分析器，精度更高
     */
    private static void recognizeChineseName(){
        System.out.println("====中文名识别===");
        String[] testCase = new String[]{
                "签约仪式前，秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。",
                "王国强、高峰、汪洋、张朝阳光着头、韩寒、小四",
                "张浩和胡健康复员回家了",
                "王总和小丽结婚了",
                "编剧邵钧林和稽道青说",
                "这里有关天培的有关事迹",
                "龚学平等领导,邓颖超生前",
                "去年老张中秋去“泡茶”，送礼遭到了拒绝，老张担心金额不够"
        };
        Segment segment = HanLP.newSegment().enableNameRecognize(true);
        for (String sentence : testCase)
        {
            List<Term> termList = segment.seg(sentence);
            System.out.println(termList);
        }
    }

    /**
     *1:音译人名标识：nrf
     *2：音译人名也是默认开启的
     */
    private static void recognizeTranslateName(){
        System.out.println("====音译人名识别===");
        String[] testCase = new String[]{
                "一桶冰水当头倒下，微软的比尔盖茨、Facebook的扎克伯格跟桑德博格、亚马逊的贝索斯、苹果的库克全都不惜湿身入镜，这些硅谷的科技人，飞蛾扑火似地牺牲演出，其实全为了慈善。",
                "世界上最长的姓名是简森·乔伊·亚历山大·比基·卡利斯勒·达夫·埃利奥特·福克斯·伊维鲁莫·马尔尼·梅尔斯·帕特森·汤普森·华莱士·普雷斯顿。",
        };
        Segment segment = HanLP.newSegment().enableTranslatedNameRecognize(true);
        for (String sentence : testCase)
        {
            List<Term> termList = segment.seg(sentence);
            System.out.println(termList);
        }
    }

    /**
     * 日本人名标识：nrj
     * 日本人名识别默认关闭的，需要手动开启。
     */
    private static void recognizeJapaneseName(){
        System.out.println("====日本人名识别===");
        String[] testCase = new String[]{
                "北川景子参演了林诣彬导演的《速度与激情3》",
                "林志玲亮相网友:确定不是波多野结衣？",
        };
        Segment segment = HanLP.newSegment().enableJapaneseNameRecognize(true);
        for (String sentence : testCase)
        {
            List<Term> termList = segment.seg(sentence);
            System.out.println(termList);
        }
    }

    /**
     * 1：地名标识：ns
     * 2：地名识别默认是关闭的，需要手工开启。
     * 3：效果不是很好，像新学乡政府就弄错了。最好弄到字典里去。
     */
    private static void recognizePlaceName(){
        System.out.println("====地名识别===");
        String[] testCase = new String[]{
                "武胜县新学乡政府大楼门前锣鼓喧天",
                "蓝翔给宁夏固原市彭阳县红河镇黑牛沟村捐赠了挖掘机",
        };
        Segment segment = HanLP.newSegment().enablePlaceRecognize(true);
        for (String sentence : testCase)
        {
            List<Term> termList = segment.seg(sentence);
            System.out.println(termList);
        }
    }

    /**
     * 机构名称标识 ：nt
     * 同地名一样，默认也是关闭的。
     */
    private static void recognizeOrganizationName(){
        System.out.println("====机构名称识别===");
        String[] testCase = new String[]{
                "我在上海林原科技有限公司兼职工作，",
                "我经常在台川喜宴餐厅吃饭，",
                "偶尔去地中海影城看电影。",
        };
        Segment segment = HanLP.newSegment().enableOrganizationRecognize(true);
        for (String sentence : testCase)
        {
            List<Term> termList = segment.seg(sentence);
            System.out.println(termList);
        }
    }

    public static void main(String[] args) {
        recognizeChineseName();
        recognizeTranslateName();
        recognizeJapaneseName();
        recognizePlaceName();
        recognizeOrganizationName();
    }
}
